00001 /*! \file 00002 * X-Forge Util <br> 00003 * Copyright 2000-2003 Fathammer Ltd 00004 * 00005 * \brief XFuConfiguration.h is the header file for the XFuConfiguration class. 00006 * 00007 * $Id: XFuTimingCounter.h,v 1.3 2003/05/13 08:53:39 kkallio Exp $ 00008 * $Date: 2003/05/13 08:53:39 $ 00009 * $Revision: 1.3 $ 00010 */ 00011 00012 #ifndef XFUTIMINGCOUNTER_H_INCLUDED 00013 #define XFUTIMINGCOUNTER_H_INCLUDED 00014 00015 #define XFU_TIMINGCOUNTER_STARTED 1 00016 #define XFU_TIMINGCOUNTER_RUNNING 2 00017 00018 //! Timing counter that takes average of a definable amount of samples. 00019 /*! 00020 * This counter can be used for evaluating time spend within functions even in the 00021 * case the time is less than the resolution of the clock. The timer takes sliding 00022 * average of large amount of samples, and thus gives results that are statistically 00023 * more accurate than the clock itself. 00024 */ 00025 class XFuTimingCounter 00026 { 00027 public: 00028 //! Constructs the timing counter with aSampleCount amount of samples 00029 static XFuTimingCounter *create(INT32 aSampleCount) 00030 { 00031 if (aSampleCount <= 0) 00032 return NULL; 00033 00034 XFuTimingCounter *counter = new XFuTimingCounter(); 00035 00036 if (counter) 00037 { 00038 counter->mSamples = new INT32[aSampleCount]; 00039 if (counter->mSamples == NULL) 00040 { 00041 delete counter; 00042 return NULL; 00043 } 00044 00045 counter->mMaxSampleCount = aSampleCount; 00046 } 00047 00048 return counter; 00049 } 00050 00051 //! Starts counting of one timing iteration 00052 virtual void start() 00053 { 00054 mTickDiff = 0; 00055 mState = XFU_TIMINGCOUNTER_STARTED; 00056 resume(); 00057 } 00058 00059 //! Stops counting of one timing iteration 00060 virtual void stop() 00061 { 00062 if (mState & XFU_TIMINGCOUNTER_STARTED) 00063 { 00064 pause(); 00065 INT32 lastTick = mSamples[mCurrentSample]; 00066 mSampleCount++; 00067 if (mSampleCount > mMaxSampleCount) 00068 { 00069 mSampleCount = mMaxSampleCount; 00070 mFirstSample = (mFirstSample + 1) % mSampleCount; 00071 } 00072 mCurrentSample = (mCurrentSample + 1) % mSampleCount; 00073 mSamples[mCurrentSample] = lastTick + mTickDiff; 00074 mState = 0; 00075 } 00076 } 00077 00078 00079 //! Pauses the counting 00080 virtual void pause() 00081 { 00082 if ((mState & (XFU_TIMINGCOUNTER_STARTED | XFU_TIMINGCOUNTER_RUNNING)) == 00083 (XFU_TIMINGCOUNTER_STARTED | XFU_TIMINGCOUNTER_RUNNING)) 00084 { 00085 INT32 tick = XFcCore::getTick(); 00086 mTickDiff = mTickDiff + (tick - mCurrentTick); 00087 mState &= ~XFU_TIMINGCOUNTER_RUNNING; 00088 } 00089 } 00090 00091 //! Resumes the counting 00092 virtual void resume() 00093 { 00094 if ((mState & (XFU_TIMINGCOUNTER_STARTED | XFU_TIMINGCOUNTER_RUNNING)) == 00095 XFU_TIMINGCOUNTER_STARTED) 00096 { 00097 mCurrentTick = XFcCore::getTick(); 00098 mState |= XFU_TIMINGCOUNTER_RUNNING; 00099 } 00100 } 00101 00102 //! Resets the counter 00103 virtual void reset() 00104 { 00105 mSampleCount = 0; 00106 mCurrentSample = 0; 00107 mFirstSample = 0; 00108 mState = 0; 00109 } 00110 00111 //! Returns the average time spent between start() and stop() calls 00112 virtual REAL getTime() 00113 { 00114 if (mSampleCount > 1) 00115 return (REAL)(mSamples[mCurrentSample] - mSamples[mFirstSample]) / (mSampleCount - 1); 00116 else 00117 return REALi(0); 00118 } 00119 00120 //! Virtual destructor 00121 virtual ~XFuTimingCounter() 00122 { 00123 delete[] mSamples; 00124 } 00125 00126 protected: 00127 XFuTimingCounter() 00128 { 00129 mSamples = NULL; 00130 mSampleCount = 0; 00131 mMaxSampleCount = 0; 00132 mCurrentSample = 0; 00133 mFirstSample = 0; 00134 } 00135 00136 INT32 *mSamples; 00137 INT32 mSampleCount; 00138 INT32 mMaxSampleCount; 00139 INT32 mFirstSample; 00140 INT32 mCurrentSample; 00141 INT32 mCurrentTick; 00142 INT32 mTickDiff; 00143 INT32 mState; 00144 }; 00145 00146 #endif //XFUTIMINGCOUNTER_H_INCLUDED
![]() | ||||
![]() |
Confidential Copyright © 2002-2003 Fathammer | with doxygen by Dimitri van Heesch |